package downLoad;

import utils.DownLoadUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 案例-实现图片、视频的文件下载
 *
 *  * 文件下载需求：
 *      1. 页面显示超链接
 *      2. 点击超链接后弹出下载提示框
 *      3. 完成图片文件下载
 *
 *   中文文件问题
 * -     解决思路：
 * -     1. 获取客户端使用的浏览器版本信息
 *       2. 根据不同的版本信息，设置filename的编码方式不同
 *
 * @author Mc.Chai
 * @program: JavaWeb
 * @create 2022-03-23-17:50 17:50
 */
@WebServlet("/downLoadServlet")
public class DownLoadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //根据请求参数获取文件的名称
        String filename = request.getParameter("filename");

        ServletContext servletContext = this.getServletContext();
        //获取图片文件的路径
        String realPath = servletContext.getRealPath("/img/"+filename);
        File file = new File(realPath);
        //需要获取的文件加载到内存中
        FileInputStream fileInputStream = new FileInputStream(file);
        //获取文件的后缀名
        String mimeType = servletContext.getMimeType(filename);
        //设置响应头：告诉服务器的数据的类型
        response.setHeader("Content-Type",mimeType);

        //解决中文文件乱码问题（使用DownLoadUtils工具类）
        //获取浏览器的版本信息
        String agent = request.getHeader("user-agent");
        //使用工具类进行编码文件名，并覆盖之前的文件名
        filename = DownLoadUtils.getFileName(agent, filename);

        //设置以文件下的方式打开,并设置文件名
        response.setHeader("Content-disposition","attachment;filename="+filename);

        //获取输出流
        ServletOutputStream outputStream = response.getOutputStream();
        while(true){
            byte[] bytes = new byte[1024 * 8];
            int read = fileInputStream.read(bytes);
            if (read==-1){break;}
            //利用输出流，发送到客户端
            outputStream.write(bytes);
        }
        //只需要关闭输入流，输出流随着response的中止而销毁
        fileInputStream.close();


    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
